package modelo;

public class Semaforo extends Thread {

	public static final Integer VERDE 	 = 0;
	public static final Integer AMARILLO = 1;
	public static final Integer ROJO 	 = 2;
	
	private Integer colorActual;
	private Integer id;
	private AdmSemaforos administrador;
	private Integer tiempoVerde;
	private Bloque ubicacion;
	
	public Semaforo(Integer id, AdmSemaforos adm) {
		this.id = id;
		this.administrador = adm;
		this.tiempoVerde = 2500;
	}
	
	@Override
	public void run() {
		this.setColorActual(Semaforo.ROJO);
		while (true) {
			this.getAdministrador().getVerde(this);
			
			this.setColorActual(Semaforo.AMARILLO);
			this.dormir(1000);
			
			this.setColorActual(Semaforo.VERDE);
			((CalleConSemaforo) this.getUbicacion()).pasaQueEstaEnVerde();
			this.dormirVerde();
			
			this.setColorActual(Semaforo.AMARILLO);
			this.dormir(1000);
			
			this.setColorActual(Semaforo.ROJO);
			this.getAdministrador().liberarVerde(this);
		}
	}
	
	protected void dormirVerde() {
		this.dormir(this.getTiempoVerde());
	}
	
	protected void dormir(Integer tiempo) {
		try {
			sleep(tiempo);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
	
	//=== GETTERS Y SETTERS ===

	public void setColorActual(Integer colorActual) {
//		System.out.println("CONTROL " + this.getIdSemaforo() + " color -> " + colorActual);
		this.colorActual = colorActual;
		this.getUbicacion().notificar(this.colorActual);
	}
	
	public Integer getIdSemaforo() {
		return id;
	}

	public void setIdSemaforo(Integer id) {
		this.id = id;
	}

	public AdmSemaforos getAdministrador() {
		return administrador;
	}

	public void setAdministrador(AdmSemaforos administrador) {
		this.administrador = administrador;
	}

	public Integer getTiempoVerde() {
		return tiempoVerde;
	}

	public void setTiempoVerde(Integer tiempoVerde) {
		this.tiempoVerde = tiempoVerde;
	}
	
	public Integer getColorActual() {
		return colorActual;
	}

	public Bloque getUbicacion() {
		return ubicacion;
	}

	public void setUbicacion(Bloque ubicacion) {
		this.ubicacion = ubicacion;
	}
	
}
